package model

//任务模板目标点类型
type TaskTemplateTargetType uint8
type CompleteProcessType uint8
type WalkItemType uint8

const (
	TargetTypeTaskEnd           TaskTemplateTargetType = 0 //任务终点
	TargetTypeTaskEndFront      TaskTemplateTargetType = 1 //任务终点前一个点
	TargetTypeRotate            TaskTemplateTargetType = 2 //旋转点
	TargetTypeNow               TaskTemplateTargetType = 3 //当前点(上一条子任务的终点)
	TargetTypeRobot             TaskTemplateTargetType = 4 //小车当前点
	TargetTypeTaskEndFrontPoint TaskTemplateTargetType = 5 //任务终点前一个点(前瞻点)

	CompleteProcessTypeNone CompleteProcessType = 0
)

const (
	WalkItemTypeNone WalkItemType = 0 //无
	WalkItemTypeRun  WalkItemType = 1 //行走高度行走
	WalkItemTypeGet  WalkItemType = 2 //取货高度行走
	WalkItemTypePut  WalkItemType = 3 //放货高度行走
)

//任务模板
type TaskTemplate struct {
	Id         int      `json:"id" bson:"id"`                                                   //主键，任务模板id
	CategoryId int      `json:"category_id" bson:"category_id"`                                 //小车子类型编号
	TaskType   TaskType `json:"task_type" bson:"task_type" binding:"required,oneof=2 3 4 5 11"` //任务类型（不可为充电、断电、待命任务）
}

//导出的主任务模板
type ExportTaskTemplate struct {
	Id         int //主键，任务模板id
	CategoryId int //小车子类型编号
	TaskType   int //任务类型（不可为充电、断电、待命任务）
}

func (TaskTemplate) TableName() string {
	return "t_data_task_templates"
}

//子任务模板
type TaskItemTemplate struct {
	Index               int                    `json:"index" bson:"index"`                                         //索引
	TaskTemplateId      int                    `json:"task_template_id" bson:"task_template_id"`                   //任务模板ID
	TaskType            TaskType               `json:"task_type" bson:"type" binding:"required,oneof=1 2 3 4 5 9"` //任务类型（不可为充电、断电、待命任务）
	TargetType          TaskTemplateTargetType `json:"target_type" bson:"target_type"`                             //任务模板目标点类型（取货、放货、行走任务启用）(取放货拆分为行走+取放货来解决原地取放货)
	ForkTemplateCmds    []*ForkTemplateCmd     `json:"fork_template_cmds" bson:"fork_template_cmds"`               //货叉指令集合（仅货叉任务使用）
	CompleteProcessType CompleteProcessType    `json:"complete_process_type" bson:"complete_process_type"`         //执行完成处理类型 0=不执行
	TargetDirection     int32                  `json:"target_direction" bson:"target_direction"`                   //0=中间、1=左、2=右、3=左2、4=右2
	PalletDetection     PalletDetectionType    `json:"pallet_detection" bson:"pallet_detection"`                   //货物检测：0=不检测、1=空托检测、2=满托检测
	IsForkReport        int                    `json:"is_fork_report" bson:"is_fork_report" `                      //货叉动作是否需要上报 0:不上报 1：上报
	CheckType           int                    `json:"check_type" bson:"check_type" `                              //货叉动作是否需要上报 0:不检测 1：任务检测 2：安全检测
	WalkType            WalkItemType           `json:"walk_type" bson:"walk_type" `                                //是否行走
	IsCallDevice        uint8                  `json:"is_call_device" bson:"is_call_device" `
	// ForkActionType      ForkActionType         `json:"fork_action_type" bson:"fork_action_type"`               //货叉动作类型
	// ForkActionValue     int32                  `json:"fork_action_value" bson:"fork_action_value"`             //货叉动作参数
}

func (walkItemType WalkItemType) GetWalkType() int32 {
	if walkItemType == WalkItemTypeRun {
		return 0
	} else if walkItemType == WalkItemTypeGet {
		return 2
	} else if walkItemType == WalkItemTypePut {
		return 1
	}
	return 0
}

//导出子任务模板
type TaskItemExportTemplate struct {
	Index               int
	TaskTemplateId      int
	TaskType            int
	TargetType          int
	ForkTemplateCmds    string
	CompleteProcessType int
	TargetDirection     int32
	PalletDetection     int
}

type ForkExportTemplateCmd struct {
	ForkType  int   `json:"fork_type"`
	ForkCmd   int32 `json:"fork_cmd"`
	ForkValue int32 `json:"fork_value"`
}

func (TaskItemTemplate) TableName() string {
	return "t_data_task_item_templates"
}

type ForkTemplateCmds []*ForkTemplateCmd

type ForkTemplateCmdArr struct {
	ForkTemplateCmdArr []*ForkExportTemplateCmd `json:"fork_cmd_arr" ` //货叉动作指令集合
}

type ForkTemplateCmd struct {
	ForkType  ForkActionType `json:"fork_type" bson:"fork_type"`   //货叉动作类型
	ForkCmd   int32          `json:"fork_cmd"  bson:"fork_cmd"`    //货叉指令（高度：0=保持、1=抬升 2=行走 3=自定义高度;   侧移:1=取货伸出、2=取货缩回、3=放货伸出、4=放货缩回 抱夹：1=闭合 2=张开）
	ForkValue int32          `json:"fork_value" bson:"fork_value"` //货叉动作参数（自定义单位mm其他按照层级来）
}
